// RAP [rh] AboutDialog left out for now
///*******************************************************************************
// * Copyright (c) 2000, 2010 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// *     IBM Corporation - initial API and implementation
// *******************************************************************************/
//package org.eclipse.ui.internal.dialogs;
//
//import java.util.ArrayList;
//import java.util.LinkedList;
//import org.eclipse.core.runtime.IBundleGroup;
//import org.eclipse.core.runtime.IBundleGroupProvider;
//import org.eclipse.core.runtime.IProduct;
//import org.eclipse.core.runtime.Platform;
//import org.eclipse.jface.action.MenuManager;
//import org.eclipse.jface.dialogs.IDialogConstants;
//import org.eclipse.jface.dialogs.TrayDialog;
//import org.eclipse.jface.resource.ImageDescriptor;
//import org.eclipse.jface.resource.JFaceColors;
//import org.eclipse.osgi.util.NLS;
//import org.eclipse.swt.SWT;
//import org.eclipse.swt.accessibility.AccessibleAdapter;
//import org.eclipse.swt.accessibility.AccessibleEvent;
//import org.eclipse.swt.custom.BusyIndicator;
//import org.eclipse.swt.custom.ScrolledComposite;
//import org.eclipse.swt.custom.StyledText;
//import org.eclipse.swt.events.ControlAdapter;
//import org.eclipse.swt.events.ControlEvent;
//import org.eclipse.swt.events.DisposeEvent;
//import org.eclipse.swt.events.DisposeListener;
//import org.eclipse.swt.events.SelectionAdapter;
//import org.eclipse.swt.events.SelectionEvent;
//import org.eclipse.swt.graphics.Color;
//import org.eclipse.swt.graphics.GC;
//import org.eclipse.swt.graphics.Image;
//import org.eclipse.swt.graphics.Point;
//import org.eclipse.swt.layout.GridData;
//import org.eclipse.swt.layout.GridLayout;
//import org.eclipse.swt.layout.RowLayout;
//import org.eclipse.swt.widgets.Button;
//import org.eclipse.swt.widgets.Composite;
//import org.eclipse.swt.widgets.Control;
//import org.eclipse.swt.widgets.Label;
//import org.eclipse.swt.widgets.Shell;
//import org.eclipse.ui.IWorkbenchCommandConstants;
//import org.eclipse.ui.IWorkbenchWindow;
//import org.eclipse.ui.PlatformUI;
//import org.eclipse.ui.internal.IWorkbenchHelpContextIds;
//import org.eclipse.ui.internal.ProductProperties;
//import org.eclipse.ui.internal.WorkbenchMessages;
//import org.eclipse.ui.internal.about.AboutBundleGroupData;
//import org.eclipse.ui.internal.about.AboutFeaturesButtonManager;
//import org.eclipse.ui.internal.about.AboutItem;
//import org.eclipse.ui.internal.about.AboutTextManager;
//import org.eclipse.ui.internal.about.InstallationDialog;
//import org.eclipse.ui.menus.CommandContributionItem;
//import org.eclipse.ui.menus.CommandContributionItemParameter;
//
///**
// * Displays information about the product.
// */
//public class AboutDialog extends TrayDialog {
//    private final static int MAX_IMAGE_WIDTH_FOR_TEXT = 250;
//
//    private final static int DETAILS_ID = IDialogConstants.CLIENT_ID + 1;
//
//    private String productName;
//
//    private IProduct product;
//
//    private AboutBundleGroupData[] bundleGroupInfos;
//
//    private ArrayList images = new ArrayList();
//
//    private AboutFeaturesButtonManager buttonManager = new AboutFeaturesButtonManager();
//
//    private StyledText text;
//    
//    private AboutTextManager aboutTextManager;
//
//    /**
//     * Create an instance of the AboutDialog for the given window.
//     * @param parentShell The parent of the dialog.
//     */
//    public AboutDialog(Shell parentShell) {
//        super(parentShell);
//
//        product = Platform.getProduct();
//        if (product != null) {
//			productName = product.getName();
//		}
//        if (productName == null) {
//			productName = WorkbenchMessages.AboutDialog_defaultProductName;
//		}
//
//        // create a descriptive object for each BundleGroup
//        IBundleGroupProvider[] providers = Platform.getBundleGroupProviders();
//        LinkedList groups = new LinkedList();
//        if (providers != null) {
//			for (int i = 0; i < providers.length; ++i) {
//                IBundleGroup[] bundleGroups = providers[i].getBundleGroups();
//                for (int j = 0; j < bundleGroups.length; ++j) {
//					groups.add(new AboutBundleGroupData(bundleGroups[j]));
//				}
//            }
//		}
//        bundleGroupInfos = (AboutBundleGroupData[]) groups
//                .toArray(new AboutBundleGroupData[0]);
//    }
//
//    /*
//     * (non-Javadoc) Method declared on Dialog.
//     */
//    protected void buttonPressed(int buttonId) {
//        switch (buttonId) {
//        case DETAILS_ID:
//			BusyIndicator.showWhile(getShell().getDisplay(), new Runnable() {
//				public void run() {
//					IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
//					InstallationDialog dialog = new InstallationDialog(getShell(), workbenchWindow);
//					dialog.setModalParent(AboutDialog.this);
//					dialog.open();	
//				}
//			});
//            break;
//        default:
//            super.buttonPressed(buttonId);
//            break;
//        }
//    }
//
//    public boolean close() {
//        // dispose all images
//        for (int i = 0; i < images.size(); ++i) {
//            Image image = (Image) images.get(i);
//            image.dispose();
//        }
//
//        return super.close();
//    }
//
//    /*
//     * (non-Javadoc) Method declared on Window.
//     */
//    protected void configureShell(Shell newShell) {
//        super.configureShell(newShell);
//        newShell.setText(NLS.bind(WorkbenchMessages.AboutDialog_shellTitle,productName ));
//        PlatformUI.getWorkbench().getHelpSystem().setHelp(newShell,
//				IWorkbenchHelpContextIds.ABOUT_DIALOG);
//    }
//
//    /**
//     * Add buttons to the dialog's button bar.
//     * 
//     * Subclasses should override.
//     * 
//     * @param parent
//     *            the button bar composite
//     */
//    protected void createButtonsForButtonBar(Composite parent) {
//        parent.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
//
//        createButton(parent, DETAILS_ID, WorkbenchMessages.AboutDialog_DetailsButton, false); 
//
//        Label l = new Label(parent, SWT.NONE);
//        l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
//        GridLayout layout = (GridLayout) parent.getLayout();
//        layout.numColumns++;
//        layout.makeColumnsEqualWidth = false;
//
//        Button b = createButton(parent, IDialogConstants.OK_ID,
//                IDialogConstants.OK_LABEL, true);
//        b.setFocus();
//    }
//
//    /**
//     * Creates and returns the contents of the upper part 
//     * of the dialog (above the button bar).
//     *
//     * Subclasses should overide.
//     *
//     * @param parent  the parent composite to contain the dialog area
//     * @return the dialog area control
//     */
//    protected Control createDialogArea(Composite parent) {
//         // brand the about box if there is product info
//        Image aboutImage = null;
//        AboutItem item = null;
//        if (product != null) {
//            ImageDescriptor imageDescriptor = ProductProperties
//                    .getAboutImage(product);
//            if (imageDescriptor != null) {
//				aboutImage = imageDescriptor.createImage();
//			}
//
//            // if the about image is small enough, then show the text
//            if (aboutImage == null
//                    || aboutImage.getBounds().width <= MAX_IMAGE_WIDTH_FOR_TEXT) {
//                String aboutText = ProductProperties.getAboutText(product);
//                if (aboutText != null) {
//					item = AboutTextManager.scan(aboutText);
//				}
//            }
//
//            if (aboutImage != null) {
//				images.add(aboutImage);
//			}
//        }
//
//        // create a composite which is the parent of the top area and the bottom
//        // button bar, this allows there to be a second child of this composite with 
//        // a banner background on top but not have on the bottom
//        Composite workArea = new Composite(parent, SWT.NONE);
//        GridLayout workLayout = new GridLayout();
//        workLayout.marginHeight = 0;
//        workLayout.marginWidth = 0;
//        workLayout.verticalSpacing = 0;
//        workLayout.horizontalSpacing = 0;
//        workArea.setLayout(workLayout);
//        workArea.setLayoutData(new GridData(GridData.FILL_BOTH));
//
//        // page group
//        Color background = JFaceColors.getBannerBackground(parent.getDisplay());
//        Color foreground = JFaceColors.getBannerForeground(parent.getDisplay());
//        Composite top = (Composite) super.createDialogArea(workArea);
//
//        // override any layout inherited from createDialogArea 
//        GridLayout layout = new GridLayout();
//        layout.marginHeight = 0;
//        layout.marginWidth = 0;
//        layout.verticalSpacing = 0;
//        layout.horizontalSpacing = 0;
//        top.setLayout(layout);
//        top.setLayoutData(new GridData(GridData.FILL_BOTH));
//        top.setBackground(background);
//        top.setForeground(foreground);
//
//        // the image & text	
//        final Composite topContainer = new Composite(top, SWT.NONE);
//        topContainer.setBackground(background);
//        topContainer.setForeground(foreground);
//
//        layout = new GridLayout();
//        layout.numColumns = (aboutImage == null || item == null ? 1 : 2);
//        layout.marginWidth = 0;
//        layout.marginHeight = 0;
//        layout.verticalSpacing = 0;
//        layout.horizontalSpacing = 0;
//        topContainer.setLayout(layout);
//        
//
//		// Calculate a good height for the text
//        GC gc = new GC(parent);
//		int lineHeight = gc.getFontMetrics().getHeight();
//		gc.dispose();
//
//        int topContainerHeightHint = 100;
//        
//		topContainerHeightHint = Math.max(topContainerHeightHint, lineHeight * 6);
//
//        //image on left side of dialog
//        if (aboutImage != null) {
//            Label imageLabel = new Label(topContainer, SWT.NONE);
//            imageLabel.setBackground(background);
//            imageLabel.setForeground(foreground);
//
//            GridData data = new GridData();
//            data.horizontalAlignment = GridData.FILL;
//            data.verticalAlignment = GridData.BEGINNING;
//            data.grabExcessHorizontalSpace = false;
//            imageLabel.setLayoutData(data);
//            imageLabel.setImage(aboutImage);
//            topContainerHeightHint = Math.max(topContainerHeightHint, aboutImage.getBounds().height);
//        }
//        
//        GridData data = new GridData();
//        data.horizontalAlignment = GridData.FILL;
//        data.verticalAlignment = GridData.FILL;
//        data.grabExcessHorizontalSpace = true;
//        data.grabExcessVerticalSpace = true;
//        data.heightHint = topContainerHeightHint;
//        topContainer.setLayoutData(data);
//        
//        if (item != null) {
//			final int minWidth = 432;
//			// This value should really be calculated
//        	// from the computeSize(SWT.DEFAULT,
//        	// SWT.DEFAULT) of all the
//        	// children in infoArea excluding the
//        	// wrapped styled text
//        	// There is no easy way to do this.
//
//			// A scrolled composite is used instead of a vertical scroll bar on
//			// the styled text, because styled text does not automatically
//			// remove the vertical bar when not needed.
//        	final ScrolledComposite scroller = new ScrolledComposite(topContainer,
//    				SWT.V_SCROLL | SWT.H_SCROLL);
//        	data = new GridData(GridData.FILL_BOTH);
//        	data.widthHint = minWidth;
//    		scroller.setLayoutData(data);
//
//    		final Composite textComposite = new Composite(scroller, SWT.NONE);
//    		textComposite.setBackground(background);
//    		
//    		layout = new GridLayout();
//    		textComposite.setLayout(layout);
//
//    		text = new StyledText(textComposite, SWT.MULTI | SWT.WRAP | SWT.READ_ONLY);
//
//    		// Don't set caret to 'null' as this causes https://bugs.eclipse.org/293263.
////    		text.setCaret(null);
//
//            text.setFont(parent.getFont());
//            text.setText(item.getText());
//            text.setCursor(null);
//            text.setBackground(background);
//            text.setForeground(foreground);
//            
//            aboutTextManager = new AboutTextManager(text);
//            aboutTextManager.setItem(item);
//            
//            createTextMenu();
//            
//    		GridData gd = new GridData();
//    		gd.verticalAlignment = GridData.BEGINNING;
//    		gd.horizontalAlignment = GridData.FILL;
//    		gd.grabExcessHorizontalSpace = true;
//    		text.setLayoutData(gd);
//
//    		// Adjust the scrollbar increments
//    		scroller.getHorizontalBar().setIncrement(20);
//    		scroller.getVerticalBar().setIncrement(20);
//
//    		final boolean[] inresize = new boolean[1]; // flag to stop unneccesary
//    		// recursion
//    		textComposite.addControlListener(new ControlAdapter() {
//    			public void controlResized(ControlEvent e) {
//    				if (inresize[0])
//    					return;
//    				inresize[0] = true;
//    				// required because of bugzilla report 4579
//    				textComposite.layout(true);
//    				// required because you want to change the height that the
//    				// scrollbar will scroll over when the width changes.
//    				int width = textComposite.getClientArea().width;
//    				Point p = textComposite.computeSize(width, SWT.DEFAULT);
//    				scroller.setMinSize(minWidth, p.y);
//    				inresize[0] = false;
//    			}
//    		});
//
//    		scroller.setExpandHorizontal(true);
//    		scroller.setExpandVertical(true);
//    		Point p = textComposite.computeSize(minWidth, SWT.DEFAULT);
//    		textComposite.setSize(p.x, p.y);
//    		scroller.setMinWidth(minWidth);
//    		scroller.setMinHeight(p.y);
//
//    		scroller.setContent(textComposite);
//        }
//
//        // horizontal bar
//        Label bar = new Label(workArea, SWT.HORIZONTAL | SWT.SEPARATOR);
//        data = new GridData();
//        data.horizontalAlignment = GridData.FILL;
//        bar.setLayoutData(data);
//
//        // add image buttons for bundle groups that have them
//        Composite bottom = (Composite) super.createDialogArea(workArea);
//        // override any layout inherited from createDialogArea 
//        layout = new GridLayout();
//        bottom.setLayout(layout);
//        data = new GridData();
//        data.horizontalAlignment = SWT.FILL;
//        data.verticalAlignment = SWT.FILL;
//        data.grabExcessHorizontalSpace = true;
//        
//        bottom.setLayoutData(data);
//
//        createFeatureImageButtonRow(bottom);
//
//        // spacer
//        bar = new Label(bottom, SWT.NONE);
//        data = new GridData();
//        data.horizontalAlignment = GridData.FILL;
//        bar.setLayoutData(data);
//
//        return workArea;
//    }
//
//    /**
//	 * Create the context menu for the text widget.
//	 * 
//	 * @since 3.4
//	 */
//	private void createTextMenu() {
//		final MenuManager textManager = new MenuManager();
//		textManager.add(new CommandContributionItem(
//				new CommandContributionItemParameter(PlatformUI
//						.getWorkbench(), null, IWorkbenchCommandConstants.EDIT_COPY,
//						CommandContributionItem.STYLE_PUSH)));
//		textManager.add(new CommandContributionItem(
//				new CommandContributionItemParameter(PlatformUI
//						.getWorkbench(), null, IWorkbenchCommandConstants.EDIT_SELECT_ALL,
//						CommandContributionItem.STYLE_PUSH)));
//		text.setMenu(textManager.createContextMenu(text));
//		text.addDisposeListener(new DisposeListener() {
//
//			public void widgetDisposed(DisposeEvent e) {
//				textManager.dispose();
//			}
//		});
//		
//	}
//
//	private void createFeatureImageButtonRow(Composite parent) {
//        Composite featureContainer = new Composite(parent, SWT.NONE);
//        RowLayout rowLayout = new RowLayout();
//        rowLayout.wrap = true;
//        featureContainer.setLayout(rowLayout);
//        GridData data = new GridData();
//        data.horizontalAlignment = GridData.FILL;
//        featureContainer.setLayoutData(data);
//
//        for (int i = 0; i < bundleGroupInfos.length; i++) {
//			createFeatureButton(featureContainer, bundleGroupInfos[i]);
//		}
//    }
//
//    private Button createFeatureButton(Composite parent,
//            final AboutBundleGroupData info) {
//        if (!buttonManager.add(info)) {
//			return null;
//		}
//
//        ImageDescriptor desc = info.getFeatureImage();
//        Image featureImage = null;
//
//        Button button = new Button(parent, SWT.FLAT | SWT.PUSH);
//        button.setData(info);
//        featureImage = desc.createImage();
//        images.add(featureImage);
//        button.setImage(featureImage);
//        button.setToolTipText(info.getProviderName());
//        
//        button.getAccessible().addAccessibleListener(new AccessibleAdapter(){
//        	/* (non-Javadoc)
//			 * @see org.eclipse.swt.accessibility.AccessibleAdapter#getName(org.eclipse.swt.accessibility.AccessibleEvent)
//			 */
//			public void getName(AccessibleEvent e) {
//				e.result = info.getProviderName();
//			}
//        });
//        button.addSelectionListener(new SelectionAdapter() {
//            public void widgetSelected(SelectionEvent event) {
//                AboutBundleGroupData[] groupInfos = buttonManager
//                        .getRelatedInfos(info);
//                AboutBundleGroupData selection = (AboutBundleGroupData) event.widget
//                        .getData();
//
//                AboutFeaturesDialog d = new AboutFeaturesDialog(getShell(),
//                        productName, groupInfos, selection);
//                d.open();
//            }
//        });
//
//        return button;
//    }
//
//	/*
//	 * (non-Javadoc)
//	 * 
//	 * @see org.eclipse.jface.dialogs.Dialog#isResizable()
//	 */
//	protected boolean isResizable() {
//		return true;
//	}
//}
